export default class StaticDate {
  constructor() {
    this.formatDate();
  }
  formatDate() {
    // 对Date的扩展，将 Date 转化为指定格式的String
    // 月(M)、日(d)、小时(h)、分(m)、秒(s)、季度(q) 可以用 1-2 个占位符，
    // 年(y)可以用 1-4 个占位符，毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
    // 例子：
    // (new Date()).Format("yyyy-MM-dd hh:mm:ss.S") ==> 2006-07-02 08:09:04.423
    // (new Date()).Format("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18

    Date.prototype.Format = function(fmt) {
      // author: meizz
      var o = {
        "M+": this.getMonth() + 1, // 月份
        "d+": this.getDate(), // 日
        "h+": this.getHours(), // 小时
        "m+": this.getMinutes(), // 分
        "s+": this.getSeconds(), // 秒
        "q+": Math.floor((this.getMonth() + 3) / 3), // 季度
        S: this.getMilliseconds() // 毫秒
      };
      if (/(y+)/.test(fmt))
        fmt = fmt.replace(
          RegExp.$1,
          (this.getFullYear() + "").substr(4 - RegExp.$1.length)
        );
      for (var k in o)
        if (new RegExp("(" + k + ")").test(fmt))
          fmt = fmt.replace(
            RegExp.$1,
            RegExp.$1.length == 1
              ? o[k]
              : ("00" + o[k]).substr(("" + o[k]).length)
          );
      return fmt;
    };
  }
  /**
   * @函数功能:获取当前的日期
   * @参数输入:timestamp：时间戳 sign:Boolea
   * @函数返回:
   */
  timeStamp(timestamp, formats) {
    formats = formats || "Y-m-d";
    var date = new Date(timestamp);
    var y = date.getFullYear();
    var m = date.getMonth() + 1;
    m = m < 10 ? "0" + m : m;
    var d = date.getDate();
    d = d < 10 ? "0" + d : d;
    var h = date.getHours();
    h = h < 10 ? "0" + h : h;
    var minute = date.getMinutes();
    minute = minute < 10 ? "0" + minute : minute;
    var second = date.getSeconds();
    second = second < 10 ? "0" + second : second;
    return formats.replace(/y|m|d|h|i|s/gi, function(matches) {
      return {
        y: y,
        m: m,
        d: d,
        h: h,
        i: minute,
        s: second
      }[matches];
    });
    // if (sign) {
    //   return y + "-" + m + "-" + d + " " + h + ":" + minute + ":" + second;
    // } else {
    //   return y + "-" + m + "-" + d;
    // }
  }
  /**
   * @函数功能:
   * @参数输入:@date 格式为yyyy-mm-dd的日期，如：2014-01-25
   * @函数返回:
   */
  getPreMonth(date) {
    var arr = date.split("-");
    var year = arr[0]; //获取当前日期的年份
    var month = arr[1]; //获取当前日期的月份
    var day = arr[2]; //获取当前日期的日
    var days = new Date(year, month, 0);
    days = days.getDate(); //获取当前日期中月的天数
    var year2 = year;
    var month2 = parseInt(month) - 1;
    if (month2 == 0) {
      year2 = parseInt(year2) - 1;
      month2 = 12;
    }
    var day2 = day;
    var days2 = new Date(year2, month2, 0);
    days2 = days2.getDate();
    if (day2 > days2) {
      day2 = days2;
    }
    if (month2 < 10) {
      month2 = "0" + month2;
    }
    var t2 = year2 + "-" + month2;
    return t2;
  }
  /**
   * @函数功能:获取本周的所有日期
   * @参数输入:
   * @函数返回:
   */
  getWeekDates(all) {
    var currentDate = new Date();
    var timesStamp = currentDate.getTime();
    var currenDay = currentDate.getDay();
    var dates = [];
    for (var i = 0; i < 7; i++) {
      dates.push(
        new Date(timesStamp + 24 * 60 * 60 * 1000 * (i - ((currenDay + 6) % 7)))
          .toLocaleDateString()
          .replace(/\//g, "-")
      );
    }
    if (all) {
      return dates;
    } else {
      return [dates[0], dates[6]];
    }
  }
  /**
   * @函数功能:获取当前日期 本月的开始日期和结束日期
   * @参数输入:
   * @函数返回:
   */
  getMonth() {
    // 获取当前月的第一天
    var start = new Date();
    start.setDate(1);
    // 获取当前月的最后一天
    var date = new Date();
    var currentMonth = date.getMonth();
    var nextMonth = ++currentMonth;
    var nextMonthFirstDay = new Date(date.getFullYear(), nextMonth, 1);
    var oneDay = 1000 * 60 * 60 * 24;
    var end = new Date(nextMonthFirstDay - oneDay);
    var startDate = this.transferDate(start); // 日期变换
    var endDate = this.transferDate(end); // 日期变换
    return [startDate, endDate];
  }
  /**
   * @函数功能:获得本季度的开始月份
   * @参数输入:
   * @函数返回:
   */
  getQuarterStartMonth() {
    var quarterStartMonth = 0;
    if (this.nowMonth < 3) {
      quarterStartMonth = 0;
    }
    if (2 < this.nowMonth && this.nowMonth < 6) {
      quarterStartMonth = 3;
    }
    if (5 < this.nowMonth && this.nowMonth < 9) {
      quarterStartMonth = 6;
    }
    if (this.nowMonth > 8) {
      quarterStartMonth = 9;
    }
    return quarterStartMonth;
  }
  /**
   * @函数功能:获得某月的天数
   * @参数输入:myMonth:月份
   * @函数返回:
   */
  getMonthDays(myMonth) {
    var monthStartDate = new Date(this.nowYear, myMonth, 1);
    var monthEndDate = new Date(this.nowYear, myMonth + 1, 1);
    var days = (monthEndDate - monthStartDate) / (1000 * 60 * 60 * 24);
    return days;
  }
  /**
   * @函数功能:获取当前年的开始日期结束日期
   * @参数输入:
   * @函数返回:[2018-1-1,2018-12-30]
   */
  getYearStartEndDate() {
    return [
      this.transferDate(new Date(this.nowYear, 0, 1)),
      this.transferDate(new Date(this.nowYear, 11, 31))
    ];
  }
  /**
   * @函数功能:获得本季度的开始日期
   * @参数输入:
   * @函数返回:
   */
  getQuarterStartEndDate() {
    var quarterStartDate = new Date(
      this.nowYear,
      this.getQuarterStartMonth(),
      1
    );

    var quarterEndMonth = this.getQuarterStartMonth() + 2;
    var quarterEndDate = new Date(
      this.nowYear,
      quarterEndMonth,
      this.getMonthDays(quarterEndMonth)
    );
    return [
      this.transferDate(quarterStartDate),
      this.transferDate(quarterEndDate)
    ];
  }
  /**
   * @函数功能:日期变换的方法
   * @参数输入:date:new Date()格式
   * @函数返回:
   */
  transferDate(date) {
    // 年
    var year = date.getFullYear();
    // 月
    var month = date.getMonth() + 1;
    // 日
    var day = date.getDate();
    if (month >= 1 && month <= 9) {
      month = "0" + month;
    }
    if (day >= 0 && day <= 9) {
      day = "0" + day;
    }
    var dateString = year + "-" + month + "-" + day;
    return dateString;
  }

  /**
   * @函数功能:获取近一周 近几天
   * @参数输入:day:number 7就是近一周
   * @函数返回:
   */
  getNearDay(day) {
    //这里的day是时间（列如：7，-7）
    let today = new Date();
    let targetday_milliseconds = today.getTime() - 1000 * 60 * 60 * 24 * day;
    today.setTime(targetday_milliseconds); //注意，这行是关键代码，到这时间已经转行为毫秒
    return this.transferDate(today);
  }
}
